package com.demo.webapp.views.freemarker.directive.core;

import com.demo.webapp.action.PageAction;

import freemarker.ext.beans.BeanModel;
import freemarker.template.ObjectWrapper;
import freemarker.template.SimpleHash;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModelException;

/**
 * 自定义指令支持类 提供自定义指令的基础方法 为模板的模板提供支持 
 * <br>
 * <pre>
 * 1.提供SimpleHash对象,使自定义指令包含的内容可作为一个新模板进行处理
 * 2.提供基础标签支持
 * (http://java.sun.com/jsp/jstl/core、http://java.sun.com/jsp/jstl/fmt)等
 * 3.提供子类处理函数
 * </pre>
 * @author ryuu.kk
 * 
 */
public abstract class PageContextDirectiveSupport extends BaseDirectiveSupport {
	
	/**
	 * 创建嵌套模板(子模板)的数据源
	 * 使用整体模板的数据,传递到嵌套模板中
	 * @param wrapper ObjectWrapper
	 * @param model TemplateHashModel 整体模板的数据Model
	 * @return SimpleHash
	 * @throws TemplateModelException
	 */
	protected SimpleHash createSimpleHash(ObjectWrapper wrapper, TemplateHashModel model) throws TemplateModelException {
		
		SimpleHash hash = super.createSimpleHash(wrapper, model);
//		HttpServletResponse response = null;
		PageAction page = null;
		BeanModel beanModel = (BeanModel) hash.get("action");
		if (beanModel != null) {
			page = (PageAction) beanModel.getWrappedObject();
		}
		
		/* ***********************************************
		 * 使用值栈取得对象,由对应的Action内容决定。
		// 设置登录用户
		User currentUser = null;
		SecurityUser secUser = SecurityUtil.getCurrentUser();
		if (secUser instanceof User) {
			currentUser = (User)secUser;
		}
		// 设置登录会员
		Member member = null;
		Object obj = SecurityUtil.getPlatformModel();
		if (obj instanceof Member) {
			member = (Member) obj;
		}
		hash.put("user", currentUser);
		hash.put("member", member);
		**************************************************** */
		hash.put("page", page);

		// 如果需要自定义指令内部访问外部数据,则推荐使用HttpScopesHashModel对象,对数据进行封装。
		//HttpScopesHashModel httpModel = new HttpScopesHashModel(wrapper, context, request, params);
		// return httpModel;
		return hash;
	}
}